package com.hrm.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;
import com.hrm.domain.Dept;
import com.hrm.domain.Employee;
import com.hrm.domain.JSONDeptResult;
import com.hrm.domain.JSONUserResult;
import com.hrm.domain.PageHelper;
import com.hrm.service.DeptService;
import com.hrm.service.EmployeeService;
import com.hrm.service.Impl.DeptServiceImpl;
import com.hrm.service.Impl.EmployeeServiceImpl;

/*
 * 部门数据控制层
 */
@WebServlet(urlPatterns = { "/getDepts", "/addDept", "/delDept", "/delDepts", "/modifyDept" })
@SuppressWarnings("all") // 使用注解抑制警告信息
public class DeptController extends HttpServlet {

	// 定义全局变量
	private DeptService ds = new DeptServiceImpl(); // CURD部门数据

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String url = request.getRequestURI(); // 获取跳转路径
		// 进行截取并判断
		String operator = url.substring(url.lastIndexOf("/") + 1);
		if ("getDepts".equals(operator)) { // 分页查询 + 模糊
			getDepts(request, response);
		} else if ("addDept".equals(operator)) { // 添加部门
			addDept(request, response);
		} else if ("delDept".equals(operator)) { // 删除指定部门
			delDept(request, response);
		} else if ("delDepts".equals(operator)) { // 删除多个部门
			delDepts(request, response);
		} else if ("modifyDept".equals(operator)) { // 修改指定部门的信息
			modifyDept(request, response);
		}
	}

	// 分页查询 + 模糊
	private void getDepts(HttpServletRequest request, HttpServletResponse response) throws IOException {
		PageHelper ph = new PageHelper(); // 简化分页查询
		List<Dept> depts = new ArrayList<>(); // 用于存储查询到的数据
		int count = 0; // 用于记录数据条数
		int flag = 0; // 用于判断情况
		String deptName = request.getParameter("deptname");
		// 获取查询出的数据记录数,并设置模糊查询
		if ("".equals(deptName)) { // 查询条件没有输入时
			flag = 1;
			count = ds.getCount(flag);
		} else { // 输入了查询条件
			flag = 2;
			deptName = "%" + deptName + "%";
			count = ds.getCount(flag, deptName);
		}
		ph.setPageIndex(1); // 设置当前页的初始数据
		// 获取当前页
		String pageNo = request.getParameter("pageNo");
		if (pageNo != null) { // 说明点了页码
			ph.setPageIndex(Integer.parseInt(pageNo)); // 重新设置页码
			ph.setTotalPageSum(ph.getTotalPageSum()); // 重新设置总页数
		}
		ph.setPageSize(ph.getPageSize()); // 设置每页显示的记录条数
		ph.setTotalRecordSum(count); // 设置总记录条数
		// 获取当前页的数据
		if (flag == 1) { // 查询条件没有输入时
			depts = ds.getDeptsByTerm(flag, ph.getStartRowNum(), ph.getPageSize());
		} else { // 输入了查询条件
			depts = ds.getDeptsByTerm(flag, deptName, ph.getStartRowNum(), ph.getPageSize());
		}
		ph.setTotalPageSum(ph.getTotalPageSum()); // 设置总页数
		// 将查询到的数据转化为json
		JSONDeptResult aur = new JSONDeptResult();
		aur.setList(depts);
		aur.setPh(ph);
		if (depts != null && depts.size() > 0) {
			aur.setMsg("success");
		}
		// 把aur对象转换成json数据
		String deptsJson = JSON.toJSONString(aur);
		// 把结果响应给客户端
		PrintWriter out = response.getWriter();
		out.write(deptsJson);
		out.flush();
		out.close();
	}

	// 添加部门
	private void addDept(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// 获取前台传递的参数
		String dName = request.getParameter("dname");
		String dRemark = request.getParameter("dremark");
		String msg = ""; // 定义返回消息
		// 多种判断,防止异常
		if (dName != "" && dRemark != "") {
			// 判断部门是否重复
			Dept dept = ds.getDeptByDN(dName);
			if (dept == null) { // 没有重复
				// 进行添加
				Dept d = new Dept(dName, dRemark);
				ds.addDept(d);
				msg = "success";
			} else { // 部门重复
				msg = "repeat";
			}
		} else {
			msg = "fail"; // 存在空数据
		}
		// 将返回信息封装
		JSONDeptResult aur = new JSONDeptResult();
		aur.setMsg(msg);
		// 把aur对象转换成json数据
		String mJSON = JSON.toJSONString(aur);
		// 把结果响应给客户端
		PrintWriter out = response.getWriter();
		out.write(mJSON);
		out.flush();
		out.close();
	}

	// 删除部门
	private void delDept(HttpServletRequest request, HttpServletResponse response) throws IOException {
		int deptID = Integer.parseInt(request.getParameter("did"));
		// 删除指定用户
		String msg = ""; // 定义返回信息
		// 获取要删除的部门的信息
		Dept dept = ds.getDeptByID(deptID);
		// 判断该部门下是否存在员工
		EmployeeService es = new EmployeeServiceImpl();
		List<Employee> emps = new ArrayList<>();
		emps = es.getEmpsByDeptID(deptID);
		if (emps.isEmpty()) { // 如果返回的集合为空,则说明该部门下没有员工,可以直接删除
			// 删除部门
			ds.delDept(deptID);
			msg = "success";
		} else { // 反之则说明该部门下有员工,则创建闲置部门,对员工进行安排
			// 判断闲置部是否存在
			Dept newDept = ds.getDeptByDN("闲置部");
			if (newDept == null) { // 不存在才创建
				// 创建闲置部门
				newDept = new Dept("闲置部", "用于安排暂时没有部门的员工");
				ds.addDept(newDept);
			}
			// 获取闲置部的ID
			Dept xz = ds.getDeptByDN("闲置部");
			int xzID = xz.getDeptID();
			// 将需要删除的部门下的员工进行闲置安排
			for (Employee emp : emps) {
				es.modifyEmpDeptByID(xzID, emp.getEmpID());
			}
			// 删除部门
			ds.delDept(deptID);
			msg = "xzcl";
		}
		// 将返回信息封装
		JSONDeptResult aur = new JSONDeptResult();
		aur.setMsg(msg);
		// 把aur对象转换成json数据
		String mJSON = JSON.toJSONString(aur);
		// 把结果响应给客户端
		PrintWriter out = response.getWriter();
		out.write(mJSON);
		out.flush();
		out.close();
	}

	// 删除多个部门
	private void delDepts(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// 获取前台传过来的数据
		String deptsJSON = request.getParameter("depts");
		// 将JSON数组转换为集合
		List<String> depts = JSON.parseArray(deptsJSON, String.class);
		int flag = 0; // 标识符判断权限问题
		String msg = ""; // 定义返回信息
		// 循环判断
		for (int i = 0; i < depts.size(); i++) {
			String deptID = depts.get(i).replaceAll(" ", "");
			// 获取要删除的部门的信息
			Dept dept = ds.getDeptByID(Integer.parseInt(deptID));
			// 判断该部门下是否存在员工
			EmployeeService es = new EmployeeServiceImpl();
			List<Employee> emps = new ArrayList<>();
			emps = es.getEmpsByDeptID(Integer.parseInt(deptID));
			if (emps.isEmpty()) { // 如果返回的集合为空,则说明该部门下没有员工,可以直接删除
				// 删除部门
				ds.delDept(Integer.parseInt(deptID));
			} else { // 反之则说明该部门下有员工,则创建闲置部门,对员工进行安排
				// 判断闲置部是否存在
				Dept newDept = ds.getDeptByDN("闲置部");
				if (newDept == null) { // 不存在才创建
					// 创建闲置部门
					newDept = new Dept("闲置部", "用于安排暂时没有部门的员工");
					ds.addDept(newDept);
				}
				// 获取闲置部的ID
				Dept xz = ds.getDeptByDN("闲置部");
				int xzID = xz.getDeptID();
				// 将需要删除的部门下的员工进行闲置安排
				for (Employee emp : emps) {
					es.modifyEmpDeptByID(xzID, emp.getEmpID());
				}
				// 删除部门
				ds.delDept(Integer.parseInt(deptID));
				flag = 1;
			}
		}
		if (flag == 0) { // 删除的部门都没有员工
			msg = "success";
		} else { // 删除的部门有存在员工的情况
			msg = "xzcl";
		}
		// 将返回信息封装
		JSONDeptResult aur = new JSONDeptResult();
		aur.setMsg(msg);
		// 把aur对象转换成json数据
		String mJSON = JSON.toJSONString(aur);
		// 把结果响应给客户端
		PrintWriter out = response.getWriter();
		out.write(mJSON);
		out.flush();
		out.close();
	}

	// 修改指定部门的信息
	private void modifyDept(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// 获取前台传递的参数
		int deptID = Integer.parseInt(request.getParameter("id"));
		String newDeptName = request.getParameter("ndname");
		String remark = request.getParameter("remark");
		String msg = ""; // 定义返回消息
		// 多种判断,防止异常
		if (newDeptName != "" && remark != "") {
			// 判断是否与其他部门的名称相同
			Dept fDept = ds.getDeptByDN(newDeptName);
			if (fDept == null || (fDept != null && (fDept.getDeptID() == deptID))) { // 没有与其他部门产生冲突
				// 进行修改
				Dept newDept = new Dept(newDeptName, remark);
				ds.modifyDeptByID(newDept, deptID);
				msg = "success";
			} else { // 部门名称重复
				msg = "repeat";
			}
		} else {
			msg = "fail"; // 存在空数据
		}
		// 将返回信息封装
		JSONDeptResult aur = new JSONDeptResult();
		aur.setMsg(msg);
		// 把aur对象转换成json数据
		String mJSON = JSON.toJSONString(aur);
		// 把结果响应给客户端
		PrintWriter out = response.getWriter();
		out.write(mJSON);
		out.flush();
		out.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
